package com.example;

import org.junit.Test;

import java.util.Date;
import java.util.Objects;

public class StringTest {

    /* String类构造方法 */
    @Test
    public void test01() {
        /* 3个String类的对象，以及1个字符串常量 */
        String a = new String(); // 产生一个String类的对象
        String b = new String("abc"); // 产生一个String类的对象
        String c = new String(new char[]{'a', 'b', 'c'}); // 产生一个String类的对象
        String d = "abc"; // 指向了常量池当中的字符串"abc"
        String e = "abc"; // 指向了常量池当中的字符串"abc"
        System.out.println(b.length()); // 字符串长度
        System.out.println(b == c); // false
        System.out.println(b == d); // false
        System.out.println(c == d); // false
        System.out.println(d == e); // true
        /* 比较字符串内容，两者相同为true */
        System.out.println(b.equals(c)); // true
        a = null; // null调用方法会报空指针异常
        // System.out.println(a.equals(b)); // false
        /* Objects.equals可以避免空指针异常 */
        System.out.println(Objects.equals(a, b)); // false
        System.out.println(Objects.equals(b, c)); // true
    }

    @Test
    public void test02() {
        User user1 = new User("张三", 20); // 产生一个User类对象
        User user2 = new User("张三", 20); // 产生一个User类对象
        System.out.println(user1 == user2); // 比较的是2个对象的堆内存地址
        System.out.println(user1.equals(user2));
    }

    @Test
    public void test03() {
        String str = "今天是2024年10月24日，我们在学习Java的String类";
        /* 字符串长度 */
        System.out.println(str.length());
        /* 求目标字符首次出现的位置：索引 */
        System.out.println(str.indexOf('2')); // 3，第4个字符
        System.out.println(str.indexOf('坤')); // 如果目标内容不存在，则返回-1
        System.out.println(str.indexOf("Java")); // 结果是J的位置
        /* 求目标字符最后一次出现的位置：索引 */
        System.out.println(str.lastIndexOf('2')); // 11
        /* 求目标位置的字符内容 */
        System.out.println(str.charAt(10)); // 第11个字符是月
        //System.out.println(str.charAt(100)); // 字符串索引越界异常
        System.out.println(str.charAt(str.length() - 1)); // 最后的字符
        /* 判断是否以XX内容开头，以XX内容结尾，是否包含某个内容 */
        /* indexOf()方法也可以判断内容是否存在，看结果是否为-1 */
        System.out.println(str.startsWith("今天")); // true
        System.out.println(str.endsWith("今天")); // false
        System.out.println(str.contains("String")); // true
        /* 内容替换，替换后的字符串以函数结果返回 */
        str = str.replace("Java", "C++");
        System.out.println(str);
        /* 字符串截取 */
        // 是目标索引开始，到最后一个字符
        System.out.println(str.substring(1));
        // 包含begin，不包含end，相当于[)
        System.out.println(str.substring(1, 1)); // 天
        /* 字符串切割得到字符串数组 */
        String[] arr = str.split("，");
        System.out.println(arr.length);
        System.out.println(arr[1]);
    }

    @Test
    public void test04() {
        String str = "今天是2024年10月24日，我们在学习Java的String类";
        /* 截取Java后的内容 */
        String java = "Java";
        int begin = str.lastIndexOf(java) + java.length();
        String value = str.substring(begin);
        System.out.println(value);
        str = str.toUpperCase(); // 转大写之后的结果是返回值
        System.out.println(str);
    }

    @Test
    public void test05() {
        /* 比较消耗内存 */
        /* ab,abc,abcd */
        /* 7个字符串常量 */
        String str = "a" + "b" + "c" + "d";
        /* 字符串缓冲减少字符串常量的使用 */
        StringBuffer sb = new StringBuffer();
        sb.append(1).append("a").append("b").append("c").append("d");
        String value = sb.toString();
        StringBuilder builder = new StringBuilder();
        builder.append("H")
                .append("e")
                .append("l")
                .append("l").append("o");
        System.out.println(builder.toString());
    }
}
